package br.com.vti.sisp_sicrim.antigo.model;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import br.com.vti.sisp_sicrim.antigo.dao.SicOperacaoDAO;
import br.com.vti.sisp_sicrim.antigo.dao.util.HibernateUtil;
import br.com.vti.sisp_sicrim.antigo.util.ExceptionProgram;

@SuppressWarnings("serial")
public class SicOperacao implements Serializable {

    private String id = "";
    private String operacao = "";
    private String programa = "";
    private String descricao = "";
    private String funcao = "";
    private Integer modulo = 0;
    private Integer dataAtu = 0;
    private Integer matriculaFunc = 0;
    // private int maxmoddis = 0;
    private Integer[] moddis = new Integer[200];
    private ResultSet consulta = null;
    private ResultSet consultaModdis = null;
    private SicOperacaoDAO sicOperacaoDAO = new SicOperacaoDAO();
    public HibernateUtil transacoes;

    public SicOperacao() {
        super();
    }

    public SicOperacao(String id, String operacao, String programa, String descricao, String funcao, Integer modulo, Integer dataAtu, Integer matriculaFunc) {
        super();
        this.id = id;
        this.operacao = operacao;
        this.programa = programa;
        this.descricao = descricao;
        this.funcao = funcao;
        this.modulo = modulo;
        this.dataAtu = dataAtu;
        this.matriculaFunc = matriculaFunc;
    }

    public void grava() {
        Connection con = null;
        try {
            con = HibernateUtil.getConnection();
            con.setAutoCommit(false);
            this.id = sicOperacaoDAO.insert(operacao, programa, descricao, funcao, modulo, dataAtu, matriculaFunc, con);
            gravaModdis(con);
            con.commit();
        } catch (Exception e) {
            try {
                con.rollback();
            } catch (SQLException ex) {
            }
            throw new ExceptionProgram(e, null, "");
        } finally {
            try {
                con.close();
            } catch (SQLException ex) {
            }
        }
    }

    public void gravaModdis(Connection con) {
        for (int seq = 1; seq < this.moddis.length; seq++) {
            if (this.moddis[seq] != null) {
                sicOperacaoDAO.insertModdis(this.id, seq, this.moddis[seq], con);
            }

        }

    }

    public void atualiza() {
        Connection con = null;
        try {
            con = HibernateUtil.getConnection();
            con.setAutoCommit(false);
            sicOperacaoDAO.update(this.id, operacao, programa, descricao, funcao, modulo, dataAtu, matriculaFunc, con);
            atualizaModdis(con);
            con.commit();
        } catch (Exception e) {
            try {
                con.rollback();
            } catch (SQLException ex) {
            }
            throw new ExceptionProgram(e, null, "");
        } finally {
            try {
                con.close();
            } catch (SQLException ex) {
            }
        }
    }

    public void atualizaModdis(Connection con) {

        for (int seq = 1; seq < this.moddis.length; seq++) {
            if (this.moddis[seq] != null) {
                sicOperacaoDAO.updateModdis(this.id, seq, this.moddis[seq], con);
            }

        }

    }

    public void exclui() {

        try {
            sicOperacaoDAO.delete(this.id);
            // excluiModdis ();
        } catch (Exception e) {
            throw new ExceptionProgram(e, null, "");
        }
    }

    public void excluiModdis() {
        for (int seq = 1; seq <= 199; seq++) {
            sicOperacaoDAO.deleteModdis(this.id, seq, this.moddis[seq]);
        }

    }

    public boolean pesquisaOperacao(String pOperacao) {

        try {
            if (consulta == null) {
                consulta = sicOperacaoDAO.findOperacao(pOperacao);
            } else {
                consulta = sicOperacaoDAO.pesquisaProximo();
            }
            if (consulta == null) {
                fecha();
                return false;
            }
            formataAtributos(consulta);
        } catch (Exception e) {
            throw new ExceptionProgram(e, null, "");
        }
        return true;
    }

    public boolean leituraMdfuop() {

        try {
            if (consulta == null) {
                consulta = sicOperacaoDAO.readMdfuop();
            } else {
                consulta = sicOperacaoDAO.pesquisaProximo();
            }
            if (consulta == null) {
                fecha();
                return false;
            }
            formataAtributos(consulta);
        } catch (Exception e) {
            throw new ExceptionProgram(e, null, "");
        }
        return true;
    }

    public boolean leituraMdfuopMaiorig(String pFuncao, String pOperacao, Integer pModulo) {

        try {
            if (consulta == null) {
                consulta = sicOperacaoDAO.readMdfuopge(pFuncao, pOperacao, pModulo);
            } else {
                consulta = sicOperacaoDAO.pesquisaProximo();
            }
            if (consulta == null) {
                fecha();
                return false;
            }
            formataAtributos(consulta);
        } catch (Exception e) {
            throw new ExceptionProgram(e, null, "");
        }
        return true;
    }

    public boolean leituraOperacao() {

        try {
            if (consulta == null) {
                consulta = sicOperacaoDAO.readOperacao();
            } else {
                consulta = sicOperacaoDAO.pesquisaProximo();
            }
            if (consulta == null) {
                fecha();
                return false;
            }
            formataAtributos(consulta);
        } catch (Exception e) {
            throw new ExceptionProgram(e, null, "");
        }
        return true;
    }

    public boolean consultaMdfuop(String pFuncao, String pOperacao, Integer pModulo) {

        try {
            if (consulta == null) {
                consulta = sicOperacaoDAO.selectMdfuop(pFuncao, pOperacao, pModulo);
            } else {
                consulta = sicOperacaoDAO.pesquisaProximo();
            }
            if (consulta == null) {
                fecha();
                return false;
            }
            formataAtributos(consulta);
        } catch (Exception e) {
            throw new ExceptionProgram(e, null, "");
        }
        return true;
    }

    public boolean fimDados() {
        return !(sicOperacaoDAO.temProximo());
    }

    public void salvarQuebras() {

    }

    public void formataAtributos(ResultSet lista) {

        if (lista == null) {
            return;
        }
        try {
            this.id = lista.getString("id");
            this.operacao = lista.getString("operacao");
            this.programa = lista.getString("programa");
            this.descricao = lista.getString("descricao");
            this.funcao = lista.getString("funcao");
            this.modulo = lista.getInt("modulo");
            this.dataAtu = lista.getInt("dataAtu");
            this.matriculaFunc = lista.getInt("matriculaFunc");
            formataModdis(this.id);
        } catch (SQLException e) {
        }
    }

    public void formataModdis(String id) {
        int seq;
        try {
            consultaModdis = sicOperacaoDAO.pesquisaModdis(id);
            while (consultaModdis != null) {
                seq = consultaModdis.getInt("seq");
                this.moddis[seq] = consultaModdis.getInt("moddis");
                consultaModdis = sicOperacaoDAO.proximoModdis();
            }
        } catch (SQLException e) {
        }

    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getOperacao() {
        return operacao;
    }

    public void setOperacao(String operacao) {
        this.operacao = operacao;
    }

    public String getPrograma() {
        return programa;
    }

    public void setPrograma(String programa) {
        this.programa = programa;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getFuncao() {
        return funcao;
    }

    public void setFuncao(String funcao) {
        this.funcao = funcao;
    }

    public Integer getModulo() {
        return modulo;
    }

    public void setModulo(Integer modulo) {
        this.modulo = modulo;
    }

    public Integer getDataAtu() {
        return dataAtu;
    }

    public void setDataAtu(Integer dataAtu) {
        this.dataAtu = dataAtu;
    }

    public Integer getMatriculaFunc() {
        return matriculaFunc;
    }

    public void setMatriculaFunc(Integer matriculaFunc) {
        this.matriculaFunc = matriculaFunc;
    }

    public Integer[] getModdis() {
        return moddis;
    }

    public void setModdis(Integer[] moddis) {
        this.moddis = moddis;
    }

    public Integer getModdis(int index) {
        return moddis[index];
    }

    public void setModdis(int index, Integer moddis) {
        this.moddis[index] = moddis;
    }

    public void fecha() {
        sicOperacaoDAO.fecha();
        consulta = null;
    }

    public long registrosProcessados() {
        return sicOperacaoDAO.nroRegistro;
    }

    public long totalRegistros() {
        return sicOperacaoDAO.qtdRegistros;
    }

}
